/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import java.util.*;
import persistencia.PersistenciaArticulo;

/**
 * Clase abstracta que representa un articulo en general
 * @author JAVA
 */
public abstract class Articulo {
    
    private Date fechaAlta;
    private Proveedor prove;
    private boolean disponible;
    private Tarifa tarifa;
    private boolean seVende;
    private int id;
    private float valoracion;
    private String titulo;

    
    public boolean isDisponible() {
        return disponible;
    }

    public void setDisponible(boolean disponible) {
        this.disponible = disponible;
    }

    public Date getFechaAlta() {
        return fechaAlta;
    }

    public void setFechaAlta(Date fechaAlta) {
        this.fechaAlta = fechaAlta;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Proveedor getProve() {
        return prove;
    }

    public void setProve(Proveedor prove) {
        this.prove = prove;
    }

    public boolean isSeVende() {
        return seVende;
    }

    public void setSeVende(boolean seVende) {
        this.seVende = seVende;
    }

    public Tarifa getTarifa() {
        return tarifa;
    }

    public void setTarifa(Tarifa tarifa) {
        this.tarifa = tarifa;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public float getValoracion() {
        return valoracion;
    }

    public void setValoracion(float valoracion) {
        this.valoracion = valoracion;
    }

    public Articulo(int id, Date fechaAlta, Proveedor prove, boolean disponible, Tarifa tarifa, boolean seVende, float valoracion, String titulo) {
        this.fechaAlta = fechaAlta;
        this.prove = prove;
        this.disponible = disponible;
        this.tarifa = tarifa;
        this.seVende = seVende;
        this.id = id;
        this.valoracion = valoracion;
        this.titulo = titulo;
    }
    
    public Articulo(Date fechaAlta, Proveedor prove, boolean disponible, Tarifa tarifa, boolean seVende, String titulo) {
        this.fechaAlta = fechaAlta;
        this.prove = prove;
        this.disponible = disponible;
        this.tarifa = tarifa;
        this.seVende = seVende;
        this.valoracion =0.0f;
        this.titulo = titulo;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Articulo other = (Articulo) obj;
        if (this.id != other.id) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + this.id;
        return hash;
    }
    
    public static Articulo obtenerArticulo(int cod) throws ExcepcionPersistencia{
        
        Articulo a=PersistenciaArticulo.obtenerArticulo(cod);
        if(a==null){
            throw new ExcepcionPersistencia("No se ha podido obtener el articulo");
        }
        return a;
    }
    
    public static void borrarArticulo(int cod) throws ExcepcionPersistencia {

        if (PersistenciaArticulo.bajaArticulo(cod) != 1) {
            throw new ExcepcionPersistencia("El articulo NO se ha eliminado correctamente");
        } 
    }
    
    public static void modificarArticulo(int cod, String nombre, String valor) throws ExcepcionPersistencia {
        if (PersistenciaArticulo.modificarArticulos(cod, nombre, valor) != 1) {
            throw new ExcepcionPersistencia("El articulo no se ha modificado correctamente");
        }
    }
    
    /**
     * Obtiene un artículo a partir de su codigo mediante la Persistencia de Articulo
     * Calcula la nueva valoración y la guarda a través de la Persistencia de Articulo
     * @param codigo del articulo sobre el que se realiza la valoracion
     * @param valoracion en formato float sobre 10
     */
    public void valorar(float valoracion) throws Exception{
        if(valoracion<0 || valoracion >10){
            throw new Exception("Error en la valoracion");
        }else{
            setValoracion((getValoracion()+valoracion)/2);
        }
   }

    /**
     * Busca juegos que coincidan en el titulo escogido
     * @param titulo 
     */
    public static void busquedaTitulo(String titulo) {
        List<Articulo> lista = PersistenciaArticulo.obtenerArticulos("titulo", titulo);
        if(lista.isEmpty()){
            System.out.println("No existen titulos");
        }
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            Articulo a = (Articulo) it.next();
            System.out.println(a.toString());
            
        }
    }
}
